package com.cs.beneficios.business.entity;

//import com.cs.beneficios.business.model.RepAtributoVO;
//import com.cs.beneficios.business.model.RepBeneficioOtorgadoVO;
import com.cs.beneficios.business.model.RepDetBeneficiarioVO;
import com.cs.beneficios.business.model.ReporteTotalBeneficiosOtorVO;
//import com.cs.beneficios.business.model.VflexVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collection;
//import java.util.LinkedList;
//import java.util.List;

public class ReporteTotalBeneficiosOtorDAO
{
  /**
   * Conexion a la base de datos.
   */
  private Connection conn = null;
  private ConnectionFactory cf;
  
  /**
   * Constructor que inicializa la conexion con la base de datos.
   * @param conn Conexion con la base de datos.
   */
   
  public ReporteTotalBeneficiosOtorDAO(ConnectionFactory cf)
  {
    this.cf = cf;
    try{
      this.conn = this.cf.getConnection();
    }catch(SQLException e){}
  }
  
  public Collection GetBeneficiosOtorgado(RepDetBeneficiarioVO criterea)throws SQLException
  {
     String query = "SELECT SUM(NVL(beneotor.VALOR_BENEFICIO,0)) valor, COUNT(beneotor.CODIGO) contador, sede.NOMBRE nomsede, prog.NOMBRE nompro, subpro.NOMBRE nomsubpro, area.NOMBRE nomarea "+
                    "FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, TCS_BEN_BENEFICIO_OTORGADO beneotor, TCS_BEN_SEDE sede, TCS_BEN_BENEFICIARIO beneficiario, " +
                    "TCS_BEN_AREA area "+
                    "WHERE beneotor.SBPR_CODIGO =  subpro.CODIGO " +
                    "AND area.codigo = prog.area_codigo "+
                    "AND beneotor.SEDE_CODIGO = sede.CODIGO "+
                    "AND subpro.PRG_CODIGO = prog.CODIGO "+
                    "AND beneficiario.CODIGO = beneotor.BEN_CODIGO and prog.vigencia='A' and subpro.vigencia='A' ";
                    
                    
    if((Object)criterea.getCodeSede() != null)
    {
      query += " and sede.CODIGO = "+criterea.getCodeSede();
    }
    if((Object)criterea.getCodeSubprograma() != null)
    {
      query += " and subpro.CODIGO = "+criterea.getCodeSubprograma();
    }
    if((Object)criterea.getCodePrograma() != null)
    {
      query += " and prog.CODIGO = "+criterea.getCodePrograma();
    }
    if((Object)criterea.getCodeArea() != null)
    {
        query += " and area.CODIGO = "+criterea.getCodeArea();
    }
    if((Object)criterea.getDesde() != null && (Object)criterea.getHasta() != null)
    {
      query += "and beneotor.FECHA_BENEFICIO between TO_DATE('"+criterea.getDesde()+"','dd/mm/rrrr') and TO_DATE('"+criterea.getHasta()+"','dd/mm/rrrr')";
    }
    if((Object)criterea.getDesde() != null && (Object)criterea.getHasta() == null)
    {
      query += "and beneotor.FECHA_BENEFICIO >= TO_DATE('"+criterea.getDesde()+"','dd/mm/rrrr')";
    }
    if((Object)criterea.getDesde() == null && (Object)criterea.getHasta() != null)
    {
      query += "and beneotor.FECHA_BENEFICIO <= TO_DATE('"+criterea.getHasta()+"','dd/mm/rrrr')";
    }
    if((Object)criterea.getGestor() != null && criterea.getCodigoAtrGestor() != null){
    query += " and Fcs_Ben_Valor_Atributo("+criterea.getCodigoAtrGestor()+", beneotor.CODIGO, beneotor.BEN_CODIGO, beneotor.FECHA_BENEFICIO) = '"+criterea.getGestor()+"' ";
    }
    
    query += " GROUP BY sede.NOMBRE,prog.NOMBRE,subpro.NOMBRE, area.nombre ";             
    query += " ORDER BY prog.NOMBRE,subpro.NOMBRE,sede.NOMBRE, area.nombre ";
    ResultSet rst = null;
    //System.out.println(query);
    ArrayList lbeneotor = new ArrayList();
    rst = cf.getRecordsRset(query,null,conn);
    ReporteTotalBeneficiosOtorVO objbeneficios = null;
    int totalBeneficios = 0;
    long total =0;
    while ( rst.next() ) 
		{
        objbeneficios = new ReporteTotalBeneficiosOtorVO();
		objbeneficios.setNombreArea(rst.getString("nomarea"));
        objbeneficios.setNombrePrograma(rst.getString("nompro"));
        objbeneficios.setNombreSubprograma(rst.getString("nomsubpro"));
        objbeneficios.setNombreSede(rst.getString("nomsede"));
        objbeneficios.setContador(rst.getString("contador"));
        totalBeneficios+=rst.getInt("contador");
        objbeneficios.setValor(rst.getLong("valor"));
        total+=rst.getLong("valor");
        lbeneotor.add(objbeneficios);
        
        objbeneficios=null;
    }
    
    if(lbeneotor.size()>0)
    {
      objbeneficios = new ReporteTotalBeneficiosOtorVO();
      objbeneficios.setNombrePrograma("VALOR TOTAL");
      objbeneficios.setContador(""+totalBeneficios);
      objbeneficios.setValor(total);
      
      lbeneotor.add(objbeneficios);
      
      objbeneficios=null;
    }
    rst.close();
    return lbeneotor;
  }
  
    public Collection GetBeneficiosOtorgadoConGestor(RepDetBeneficiarioVO criterea)throws SQLException
    {
       String query = "SELECT SUM(NVL(beneotor.VALOR_BENEFICIO,0)) valor, COUNT(beneotor.CODIGO) contador, sede.NOMBRE nomsede, prog.NOMBRE nompro, subpro.NOMBRE nomsubpro "+
                      "FROM TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA subpro, TCS_BEN_BENEFICIO_OTORGADO beneotor, TCS_BEN_SEDE sede, TCS_BEN_BENEFICIARIO beneficiario, " +
                      "TCS_BEN_AREA area, TCS_BEN_SUBP_ATR_BENEFICIARIO sab "+
                      "WHERE beneotor.SBPR_CODIGO =  subpro.CODIGO " +
                      "AND area.codigo = prog.area_codigo "+
                      "AND beneotor.SEDE_CODIGO = sede.CODIGO "+
                      "AND subpro.PRG_CODIGO = prog.CODIGO "+
                      "AND beneficiario.CODIGO = beneotor.BEN_CODIGO and prog.vigencia='A' and subpro.vigencia='A'" +
                      "AND sab.SBPR_CODIGO = subpro.codigo AND UPPER(TRIM(sab.NOMBRE)) = 'GESTOR' ";
                      
                      
      if((Object)criterea.getCodeSede() != null)
      {
        query += " and sede.CODIGO = "+criterea.getCodeSede();
      }
      if((Object)criterea.getCodeSubprograma() != null)
      {
        query += " and subpro.CODIGO = "+criterea.getCodeSubprograma();
      }
      if((Object)criterea.getCodePrograma() != null)
      {
        query += " and prog.CODIGO = "+criterea.getCodePrograma();
      }
      if((Object)criterea.getCodeArea() != null)
      {
          query += " and area.CODIGO = "+criterea.getCodeArea();
      }
      if((Object)criterea.getDesde() != null && (Object)criterea.getHasta() != null)
      {
        query += "and beneotor.FECHA_BENEFICIO between TO_DATE('"+criterea.getDesde()+"','dd/mm/rrrr') and TO_DATE('"+criterea.getHasta()+"','dd/mm/rrrr')";
      }
      if((Object)criterea.getDesde() != null && (Object)criterea.getHasta() == null)
      {
        query += "and beneotor.FECHA_BENEFICIO >= TO_DATE('"+criterea.getDesde()+"','dd/mm/rrrr')";
      }
      if((Object)criterea.getDesde() == null && (Object)criterea.getHasta() != null)
      {
        query += "and beneotor.FECHA_BENEFICIO <= TO_DATE('"+criterea.getHasta()+"','dd/mm/rrrr')";
      }
      if((Object)criterea.getGestor() != null && criterea.getCodigoAtrGestor() != null){
      query += " and Fcs_Ben_Valor_Atributo("+criterea.getCodigoAtrGestor()+", beneotor.CODIGO, beneotor.BEN_CODIGO, beneotor.FECHA_BENEFICIO) = '"+criterea.getGestor()+"' ";
      }
      
      query += " GROUP BY sede.NOMBRE,prog.NOMBRE,subpro.NOMBRE, area.nombre ";             
      query += " ORDER BY prog.NOMBRE,subpro.NOMBRE,sede.NOMBRE, area.nombre ";
      ResultSet rst = null;
      //System.out.println(query);
      ArrayList lbeneotor = new ArrayList();
      rst = cf.getRecordsRset(query,null,conn);
      ReporteTotalBeneficiosOtorVO objbeneficios = null;
      int totalBeneficios = 0;
      long total =0;
      while ( rst.next() ) 
                  {
          objbeneficios = new ReporteTotalBeneficiosOtorVO();
          objbeneficios.setNombrePrograma(rst.getString("nompro"));
          objbeneficios.setNombreSubprograma(rst.getString("nomsubpro"));
          objbeneficios.setNombreSede(rst.getString("nomsede"));
          objbeneficios.setContador(rst.getString("contador"));
          totalBeneficios+=rst.getInt("contador");
          objbeneficios.setValor(rst.getLong("valor"));
          total+=rst.getLong("valor");
          lbeneotor.add(objbeneficios);
          
          objbeneficios=null;
      }
      
      if(lbeneotor.size()>0)
      {
        objbeneficios = new ReporteTotalBeneficiosOtorVO();
        objbeneficios.setNombrePrograma("VALOR TOTAL");
        objbeneficios.setContador(""+totalBeneficios);
        objbeneficios.setValor(total);
        
        lbeneotor.add(objbeneficios);
        
        objbeneficios=null;
      }
      rst.close();
      return lbeneotor;
    }
  
  /************************************************
   * Metodo para provisional para recuprar los filtros utilizados en el reporte
   * *********************************************/
   public RepDetBeneficiarioVO getFilters(RepDetBeneficiarioVO objRtbVO)throws SQLException
   {
     String strQuery = null;
     ResultSet rst = null;
     
     if(objRtbVO.getCodeSede() != null)
     {
       strQuery = "SELECT NOMBRE" +
                  " FROM TCS_BEN_SEDE" +
                  " WHERE CODIGO = " + objRtbVO.getCodeSede();
       rst = cf.getRecordsRset(strQuery,null,conn);
       
       rst.next();
       objRtbVO.setNombreSede(rst.getString("NOMBRE"));
     }
     if(objRtbVO.getCodePrograma() != null)
     {
       strQuery = "SELECT NOMBRE" +
                  " FROM TCS_BEN_PROGRAMA" +
                  " WHERE CODIGO = " + objRtbVO.getCodePrograma();
       rst = cf.getRecordsRset(strQuery,null,conn);
       
       rst.next();
       objRtbVO.setNombrePrograma(rst.getString("NOMBRE"));
     }
     if(objRtbVO.getCodeSubprograma() != null)
     {
       strQuery = "SELECT NOMBRE" +
                  " FROM TCS_BEN_SUBPROGRAMA" +
                  " WHERE CODIGO = " + objRtbVO.getCodeSubprograma();
       rst = cf.getRecordsRset(strQuery,null,conn);
       
       rst.next();
       objRtbVO.setNombreSubprograma(rst.getString("NOMBRE"));
     }
    if(objRtbVO.getCodeArea() != null)
    {
     strQuery = "SELECT NOMBRE" +
                " FROM TCS_BEN_AREA" +
                " WHERE CODIGO = " + objRtbVO.getCodeArea();
     rst = cf.getRecordsRset(strQuery,null,conn);
     
     rst.next();
     objRtbVO.setNombreArea(rst.getString("NOMBRE"));
    }
     
     if(rst != null)
       rst.close();
       
     return objRtbVO;
   }
  
  public Connection getConn()
  {
    return conn;
  }
}